package fr.miage.resources;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.log4j.Logger;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

import fr.miage.connexion.ConnexionBD;
import fr.miage.dao.UserDAO;
import fr.miage.model.Invitation;
import fr.miage.model.User;

@Path("/user")
public class UserResource {
	private UserDAO userDAO = new UserDAO();
	private Logger logger = Logger.getRootLogger();
	
	@Path("/{id : [0-9]+}")
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Response getUser(@PathParam("id") String id){
		User user = userDAO.getById(id);
		ObjectMapper mapper = new ObjectMapper();
		if(user == null){
			return Response.status(404).build();
		}else{
			String fluxJson;
			try {
				fluxJson = mapper.writeValueAsString(user);
				return Response.ok(fluxJson).build();
			} catch (JsonGenerationException e) {
				logger.error(e);
				return Response.status(500).build();
			} catch (JsonMappingException e) {
				logger.error(e);
				return Response.status(500).build();
			} catch (IOException e) {
				logger.error(e);
				return Response.status(500).build();
			}
		}
	}
	
	@PUT
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public Response addUser(User user){
		if (user == null) {
			return Response.status(400).entity("User n'est pas correctement formé").build();
		}else{
			if(!user.getName().matches("[a-zA-Z -éàèêëîïôö]+")){
				return Response.status(400).entity("Le nom contient des caractères non autorisés").build();
			}
			if(!user.getFirstName().matches("[a-zA-Z -éàèêëîïôö]+")){
				return Response.status(400).entity("Le prenom contient des caractères non autorisés").build();
			}
			if(!user.getPhone().matches("[0-9]{10}")){
				return Response.status(400).entity("Le telephone contient des caractères non autorisés").build();
			}
			if(!user.getMail().matches("^[A-Za-z0-9\\._-]+@[A-Za-z0-9\\.-_]+.[a-zA-Z]{2,4}$")){
				return Response.status(400).entity("L'adresse mail contient des caractères non autorisés").build();
			}
			int nbRes = userDAO.addUser(user);
			if(nbRes == -1){
				return Response.status(409).entity("Cet identifiant existe déjà").build();
			}else if(nbRes != 1){
				return Response.status(400).entity("Les paramètres entrés sont incorrects (clés étrangères non respectées ou event existe déjà)").build();
			}else{
				return Response.ok().build();
			}
		}
	}
	
	@DELETE
	@Consumes(MediaType.APPLICATION_JSON)
	@Path("/{id:[0-9]+}")
	public Response deleteUser(@PathParam(value="id") String id){
		int nbRes = userDAO.deleteUser(id);
		if(nbRes != 1){
			return Response.status(400).entity("Les paramètres entrés sont incorrects (id inexistant ?)").build();
		}else{
			return Response.ok().build();
		}
	}
	
	@GET
	@Path("/event/{idEvent:[0-9]+}")
	public Response getAllUserByEvent(@PathParam(value="idEvent")String idEvent){
		List<User> listeUser = userDAO.getAllUserByEvent(idEvent);
		ObjectMapper mapper = new ObjectMapper();
		if(listeUser == null || listeUser.size() == 0){
			return Response.status(404).build();
		}else{
			String fluxJson;
			try {
				fluxJson = mapper.writeValueAsString(listeUser);
				return Response.ok(fluxJson).build();
			} catch (JsonGenerationException e) {
				logger.error(e);
				return Response.status(500).build();
			} catch (JsonMappingException e) {
				logger.error(e);
				return Response.status(500).build();
			} catch (IOException e) {
				logger.error(e);
				return Response.status(500).build();
			}
		}
	}
	
	
}
